package com.yict.common.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.yict.common.entity.PageEntity;

/**
 * 基础存储类
 * 
 * @author tortoi.huang
 * 
 * @param <T>
 * @param <PK>
 */
public interface IBaseDao<T, PK extends Serializable> {

	/**
	 * 添加记录
	 * 
	 * @param t
	 * @return
	 * @throws Exception
	 */
	public boolean save(T t) throws Exception;
	
	public boolean save(List<T> t) throws Exception;

	/**
	 * 更新记录
	 * 
	 * @param t
	 * @return
	 * @throws Exception
	 */
	public boolean update(T t) throws Exception;

	/**
	 * 删除记录
	 * 
	 * @param t
	 * @return
	 * @throws Exception
	 */
	public boolean remove(T t) throws Exception;

	/**
	 * 删除记录
	 * 
	 * @param ids
	 * @return
	 * @throws Exception
	 */
	public boolean remove(final PK[] ids) throws Exception;

	/**
	 * 删除记录
	 * 
	 * @param ids
	 * @return
	 * @throws Exception
	 */
	public boolean remove(final Collection<PK> ids) throws Exception;

	/**
	 * 根据主键查询记录
	 * 
	 * @param id
	 * @return
	 */
	public T findbyId(PK id);

	/**
	 * 分页查询
	 * 
	 * @param valueMap
	 * @param page
	 * @return
	 */
	@Deprecated
	public List<T> search(Map<String, Object> valueMap, PageEntity page);

	/**
	 * 根据条件查询记录
	 * 
	 * @param valueMap
	 *            所有条件做等于查询
	 * @return
	 */
	public int queryCount(Map<String, Object> valueMap);

	/**
	 * 查询总记录数
	 * 
	 * @param queryString
	 * @param valueMap
	 * @return
	 */
	public int queryCount(final String queryString,
			final Map<String, Object> valueMap);

	/**
	 * 排序分页查询
	 * 
	 * @param valueMap
	 * @param orderList
	 *            key为排序列名称，value为true则正序，否则倒序查询
	 * @param rowFrom
	 * @param rowSize
	 * @return
	 */
	public List<T> list(Map<String, Object> valueMap,
			LinkedHashMap<String, Boolean> orderList, int rowFrom, int rowSize);

	/**
	 * 排序分页查询
	 * 
	 * @param queryString
	 * @param valueMap
	 * @param orderList
	 *            key为排序列名称，value为true则正序，否则倒序查询
	 * @param rowFrom
	 * @param rowSize
	 * @return
	 */
	public List<T> list(String queryString, Map<String, Object> valueMap,
			int rowFrom, int rowSize);
	
	/**
	 * 本地sql排序分页查询
	 * 
	 * @param queryString
	 * @param valueMap
	 * @param orderList
	 *            key为排序列名称，value为true则正序，否则倒序查询
	 * @param rowFrom
	 * @param rowSize
	 * @return
	 */
	public List<T> listSql(final String queryString,
			final Map<String, Object> valueMap, final int rowFrom,
			final int rowSize);

	/**
	 * 获取数据库时间
	 * 
	 * @return
	 */
	public Date queryDbTimeStamp();
}
